﻿using Microsoft.AspNetCore.Mvc;
using System.Text.Json.Serialization;
using Newtonsoft.Json;
using 系统中间件.Session扩展;

namespace 系统中间件.Controllers
{
    //Session中间件
    public class SessionController : Controller
    {
        private readonly ISession session;
        private readonly ILogger logger;
        private readonly IHttpContextAccessor httpContextAccessor;//

        public SessionController(ILogger<SessionController> logger, IHttpContextAccessor httpContextAccessor)
        {
            this.session = httpContextAccessor.HttpContext.Session;
            this.logger = logger;
            this.httpContextAccessor = httpContextAccessor;
        }




        /**
            Session中间件
            会话是指浏览器打开到关闭的过程中，多次与服务器发送接收数据的过程。
            Session是服务器内存中创建和保存的
            Http请求本身是无状态的，但是为了保持用户的请求数据，方便其下次进行请求，服务器会将每个浏览器表示，将每个浏览器要保存的数据
            保存下来，以备不时之需。
            小项目用的比较多，但大的项目，分布式项目不再使用。（单体架构的项目可用）
            每一个Session都有一个ID来标识
        **/
        public IActionResult Index()
        {
           
            session.SetString("username", "余冰");
            string aa= session.GetString("username");

            //每个用户都有自己的session内存块，不会和其他用户把数据搞混。
            //利用Session传值，可以跨Action、跨控制器，因为你的数据是在会话内部存在，用户不关闭浏览器，你的数据就存在。


            return View();
        }
        //浏览器关掉后多久session会消失
        //Session的配置和属性
        //系统怎么标识某个浏览器：  某个浏览器浏览asp.net的网页，就会在浏览器本地生成一个名为Asp.net Core 的 Cookie 并且是Httponlyd的，这种只能由前端JS操作，无法用C#操作
        // 这个Cookie标识了你这个浏览器属于哪个Session


        //Session的一些属性
        public IActionResult About() 
        {
            //获取Session id
            var sessinId =  session.Id;//同一个会话中，这个ID是唯一的
            return View(sessinId);
        }


        //对象序列化存入session
        public IActionResult Index2()
        {
            //对象序列化后存入Session
            UserInfo info = new() { Id = 1, Name = "任我行", Birthday = DateTime.Now }; 
            session.SetString("Info",JsonConvert.SerializeObject(info));
            //使用扩展方法
            session.Set<UserInfo>("Info",info);
            return View();
        }


        /// <summary>
        /// 将Session中数据取出、反序列化成制定对象
        /// </summary>
        /// <returns></returns>
        public IActionResult Index3()
        {
            UserInfo info =JsonConvert.DeserializeObject<UserInfo>( session.Get("Info").ToString());

            //扩展方法 
            UserInfo info1 = session.Get<UserInfo>("Info");

            return View(info);
        }
    }

    public class UserInfo
    { 
        public int Id { get; set; }

        public string Name { get; set; }

        public DateTime Birthday { get; set; }
    }
}
